自建光场平台获取的白图像处理&微透镜中心标定 您所在的位置:网站首页 lytro 相机 自建光场平台获取的白图像处理&微透镜中心标定

自建光场平台获取的白图像处理&微透镜中心标定

2023-08-14 10:53| 来源: 网络整理| 查看: 265

一、预备尝试多种微透镜中心标定方法,查资料(参考资料:https://blog.csdn.net/lichenhaod/article/details/47707189)已知的有:

1、多频相移标定法

微透镜对光线具有汇聚作用,在微透镜中心的像素具有较高的亮度,基于这种特性,可以用峰值检测方法,用峰值像素所在的位置代替微透镜的中心位置。多频相移标定法:通过在显示器上显示多频相移图像,然后用光场相机进行拍摄,对拍摄到的所有图像求均值;对得到的均值图像进行峰值检测即可得到微透镜的中心坐标,实际上得到所有微透镜的中心坐标。

2、选取一处颜色相对均匀的平面,比如说墙壁或者桌面,调整光线尽量均匀,然后用光场相机进行拍摄,多角度拍摄即可,拍摄5-10幅图片,然后求均值,最后用峰值检测算法进行检测即可。

3、对一二得到的均值图像进行边缘检测,或者二值化,将均值图划分为单个微透镜圆孔图像,然后计算每个微透镜圆孔图像的重心即可。重心即可认为是微透镜的中心。

 

二、预期白图像处理步骤:

1.二值化处理

matlab中关于im2bw函数的使用:

I1 = im2bw(I); %带一个参数,默认阈值为0.5

I2 = im2bw(I, 0.25); %带两个参数,第二个参数为自定义的阈值

level = graythresh(I); %graythresh函数求图像的自适应阈值,其实就是求图像的平均像素值,需要注意的是像素区间[0,255],归一化至区间 [0,1] I3 = im2bw(I,level);

% 用matlab对图像进行二值化处理 %打开文件夹选择图像 [filename,filepath]=uigetfile('*.bmp;*.BMP;*.jpg'); disp(filename); disp(filepath); file=[filepath,filename]; I = imread(file); %输出几种阈值的二值化图像 figure(1); subplot(221); imshow(I); title('原始图像'); I1 = im2bw(I); subplot(222); imshow(I1); title( '使用默认阈值0.5'); I2 = im2bw(I, 0.25); subplot(223); imshow(I2); title( '指定阈值为0.25'); level = graythresh(I); I3 = im2bw(I,level); subplot(224); imshow(I3); title('使用最大类间方差法(Otsu)获得阈值');

运行结果如下:

这样二值化出的结果不能得到每个微透镜的中心,考虑两种方法解决:

1、将图像分块,每个小块计算个自适应的阈值,对各块二值化处理后再拼接起来

涉及到矩阵分割与合并,用元胞处理比矩阵分割合并方便。

参考:matlab怎么合并两个矩阵

matlab使用 k=[m,n] 进行横向拼接,使用 f=[w;h] 进行纵向拼接,需要注意的是,m,n要求行数相同,w,h要求列数相同,这意味着分成了 i*j 块的图像必需先分别拼好 i 行之后,才能再对 i 个块进行纵向拼接,十分麻烦。

所以考虑用元胞进行拆分合并,matlab提供了十分便捷的函数。

参考:matlab将大矩阵分块并还原

其中提到了两个函数:

B=mat2cell(A,[10,20,30,40],[25,75,100]);

% 该表达式将A分成了 4*3 块元胞,元胞的大小分别是

\begin{bmatrix} 10*25& 10*75& 10*100\\ 20*25& 20*75& 20*100\\ 30*25& 30*75& 30*100\\ 40*25& 40*75& 40*100 \end{bmatrix}

% B{i,j}就是A的分块矩阵

C=cell2mat(B) %将 B 还原为大矩阵 C 。

 

但是,这样的处理对于不确定分多少块最佳,或者分成很多固定大小的块就过于蠢笨,参考http://www.ilovematlab.cn/thread-532752-1-1.html中最佳答案,和 Matlab中mat2cell的使用 中对 mat2cell函数使用的解释,以及 https://blog.csdn.net/u010099080/article/details/50499828 中对 cellfun函数的使用。重新改写上面的二值化函数,代码如下:

% 用matlab对图像进行二值化处理 [filename,filepath]=uigetfile('*.bmp;*.BMP;*.jpg'); disp(filename); disp(filepath); file=[filepath,filename]; I = imread(file); %分块计算二值化阈值,分为(m,n)块,m,n需能被图像大小整除 %测试图像的 h=1944,w=2592 m=9; n=9; [h,w,z]=size(I); disp(h); disp(w); disp(z); minI=mat2cell(I,(h/m)*ones(1,m),(w/n)*ones(1,n),z);%minI被拆分为8*8个cell,每个cell大小为(h/8,w/8) level = cellfun(@(x)graythresh(x(:)),minI); disp(level); % I3 = cellfun(@(x)im2bw(x(:),level),minI); %im2bw函数不支持这么使用 I3 = cell(m,n); for i=1:m for j=1:n I3{i,j} = im2bw(minI{i,j},level(i,j)); end end I4 = cell2mat(I3); figure(2); subplot(221); imshow(I); title('原始图像'); I1 = im2bw(I); subplot(222); imshow(I1); title( '使用默认阈值0.5'); level = graythresh(I); I2 = im2bw(I,level); subplot(223); imshow(I2); title( '使用最大类间方差法(Otsu)获得阈值'); subplot(224); imshow(I4); title('使用分块自适应阈值');

结果如下图:

效果对比全局阈值好了一些,但要求每个微透镜的中心还达不到要求,考虑尝试

1)不同分块,综合多个分块结果

2)其他处理,如腐蚀膨胀等

2、先对图像做白平衡处理,再对图像二值化。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有